package com.ncoach.tracing.model.service.impl;

import java.sql.SQLException;
import java.util.List;

import javax.inject.Inject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;

import com.ncoach.tracing.model.bean.Paciente;
import com.ncoach.tracing.model.exception.DatabaseDeleteException;
import com.ncoach.tracing.model.exception.DatabaseInsertException;
import com.ncoach.tracing.model.exception.DatabaseRetrieveException;
import com.ncoach.tracing.model.repository.IPacienteRepository;
import com.ncoach.tracing.model.service.IPacienteService;

// TODO: Auto-generated Javadoc
/**
 * The Class PacienteService.
 */
@Service
class PacienteService implements IPacienteService {

	private static final Log LOG = LogFactory.getLog(PacienteService.class);

	/** The paciente repository. */
	@Inject
	private IPacienteRepository pacienteRepository;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.ncoach.tracing.model.service.IModelService#delete(com.ncoach.tracing
	 * .model.bean.IModelTable)
	 */
	@Override
	public void delete(Paciente paciente) throws DatabaseDeleteException {
		try {
			pacienteRepository.delete(paciente);
			LOG.debug(new StringBuffer("Se ha borrado el paciente con id: ")
					.append(paciente.getId()).toString());
		} catch (SQLException e) {
			LOG.error("Error al borrar el paciente de base de datos.");
			throw new DatabaseDeleteException(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ncoach.tracing.model.service.IModelService#findAll()
	 */
	@Override
	public List<Paciente> findAll() throws DatabaseRetrieveException {
		try {
			List<Paciente> result = pacienteRepository.findAll();
			LOG.debug(new StringBuffer("Se han recuperado ")
					.append(result.size()).append(" pacientes.").toString());
			return result;
		} catch (SQLException e) {
			LOG.error("Error al recuperar todos los pacientes de base de datos.");
			throw new DatabaseRetrieveException(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.ncoach.tracing.model.service.IModelService#findOne(java.lang.Integer)
	 */
	@Override
	public Paciente findOne(Integer pId) throws DatabaseRetrieveException {
		try {
			Paciente result = pacienteRepository.findOne(pId);
			LOG.debug(new StringBuffer("Se ha recuperado el paciente: ")
					.append(result.getNombre()).toString());
			return result;
		} catch (SQLException e) {
			LOG.error(new StringBuffer(
					"Error al recuperar el paciente con id: ").append(pId)
					.toString());
			throw new DatabaseRetrieveException(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.ncoach.tracing.model.service.IModelService#save(com.ncoach.tracing
	 * .model.bean.IModelTable)
	 */
	@Override
	public Integer save(Paciente paciente) throws DatabaseInsertException {
		try {
			Integer result = pacienteRepository.save(paciente);
			LOG.debug(new StringBuffer(
					"Se ha guardado en base de datos el paciente: ")
					.append(paciente.getNombre()).toString());
			return result;
		} catch (SQLException e) {
			LOG.error("Error al insertar el paciente en base de datos.");
			throw new DatabaseInsertException(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.ncoach.tracing.model.service.IModelService#update(com.ncoach.tracing
	 * .model.bean.IModelTable)
	 */
	@Override
	public void update(Paciente paciente) throws DatabaseInsertException {
		try {
			pacienteRepository.update(paciente);
			LOG.debug(new StringBuffer("Se ha actualizado el paciente: ")
					.append(paciente.getNombre()).toString());
		} catch (SQLException e) {
			LOG.error("Error al actualizar el paciente en base de datos.");
			throw new DatabaseInsertException(e.getMessage(), e);
		}
	}

}
